﻿//#include<iostream>
//#include<vector>
//using namespace std;

//struct Point
//{
//	//explicit Point(int x, int y)
//	Point(int x, int y)
//		:_x(x)
//		, _y(y)
//	{
//		cout << "Point(int x, int y)" << endl;
//	}
//
//	int _x;
//	int _y;
//};
//
//
//int main()
//{
//	Point p2(2, 3);		// 显式构造（你明确写出构造）
//
//	Point p1 = { 1,2 }; //隐式构造 —— 编译器自己帮你调用构造函数
//						//本质是：
//						//Point temp = Point(1, 2); // 隐式调用构造函数
//						//Point p1 = temp;          // 拷贝/移动构造（或优化掉）
//
//
//	vector<int> v1 = { 1,2,3,4,3 };  // ✅调用 initializer_list 的构造函数
//									 // 它有一个构造函数是 std::initializer_list<int> 的👇：
//									 //	vector(std::initializer_list<int>)	
//									 // 所以你写 {1,2,3,4,3}，编译器看到“你给了个 initializer_list”，那就直接走这个构造函数。
//	return 0;
//}

//int main()
//{
//	//int a = 1, b = 2;
//
//	//double rate = 2.2;
//	//auto add1 = [rate](int x, int y){return (x + y)*rate;};
//	//auto add2 = [rate](int x, int y)->int {return (x + y) * rate;};
//
//	//cout << add1(a, b) << endl;
//	//cout << add2(a, b) << endl;
//
//
//
//	//auto swap1 = [](int&x, int& y) {
//	//	int tmp = x;
//	//	x = y;
//	//	y = tmp;
//	//	};
//
//	//swap1(a, b);
//	//cout << a << " " << b << endl;
//
//
//	int x = 1;
//	int y = 2;
//	//auto swap3 = [&x, &y](){
//	auto swap3 = [&x, &y] {
//		int tmp = x;
//		x = y;
//		y = tmp;
//		};
//	swap3();
//	cout << x << " " << y << endl;
//
//
//
//	return 0;
//
//}


#include <iostream>
#include <cstring>  // 为了使用 strcpy_s
#include <utility>  // 手动交换

using namespace std;

class MyClass {
public:
    char* data;

    // 构造函数
    MyClass(const char* str) {
        data = new char[strlen(str) + 1];
        strcpy_s(data, strlen(str) + 1, str);  // 使用 strcpy_s 来避免警告
        cout << "普通构造函数调用\n";
    }

    // 拷贝构造函数（使用手动交换）
    
    MyClass(const MyClass& other) {
        data = new char[strlen(other.data) + 1];
        strcpy_s(data, strlen(other.data) + 1, other.data);  // 正确拷贝数据
        cout << "拷贝构造函数调用\n";
    }


    // 移动构造函数（使用手动交换）
    MyClass(MyClass&& other) {
        swap(data, other.data);  // 交换指针
        cout << "移动构造函数调用\n";
    }

    ~MyClass() {
        delete[] data;  // 释放资源
        cout << "析构函数调用\n";
    }

    void print() const {
        cout << data << endl;
    }
};

int main() {
    MyClass obj1("Hello");
    MyClass obj2 = obj1;  // 调用拷贝构造函数
    obj2.print();

    MyClass obj3 = std::move(obj1);  // 调用移动构造函数
    obj3.print();

    return 0;
}
